WebAssemblyã®äŸå€åŠçãšã¹ã¿ãã¯ãã¬ãŒã¹ã®è©³çްãªè§£èª¬ã倿§ãªãã©ãããã©ãŒã ã§å ç¢ãã€ãããã°å¯èœãªã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ããããã«ããšã©ãŒã³ã³ããã¹ãã®ä¿æãéåžžã«éèŠã§ããããšã匷調ããŸãã
WebAssemblyäŸå€åŠçã¹ã¿ãã¯ãã¬ãŒã¹ïŒå ç¢ãªã¢ããªã±ãŒã·ã§ã³ã®ããã®ãšã©ãŒã³ã³ããã¹ãã®ä¿æ
WebAssembly (Wasm) ã¯ã髿§èœãªã¯ãã¹ãã©ãããã©ãŒã ã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ããããã®åŒ·åãªãã¯ãããžãŒãšããŠç»å ŽããŸããããã®ãµã³ãããã¯ã¹åãããå®è¡ç°å¢ãšå¹ççãªãã€ãã³ãŒã圢åŒã¯ããŠã§ãã¢ããªã±ãŒã·ã§ã³ããµãŒããŒãµã€ãããžãã¯ãããçµã¿èŸŒã¿ã·ã¹ãã ãã²ãŒã éçºãŸã§ãå¹ åºããŠãŒã¹ã±ãŒã¹ã«æé©ã§ããWebAssembly ã®æ¡çšãæ¡å€§ããã«ã€ããŠãã¢ããªã±ãŒã·ã§ã³ã®å®å®æ§ã確ä¿ããå¹ççãªãããã°ãä¿é²ããããã«ãå ç¢ãªãšã©ãŒåŠçããŸããŸãéèŠã«ãªã£ãŠããŸãã
ãã®èšäºã§ã¯ãWebAssembly ã®äŸå€åŠçã®è€éããšãããã«éèŠãªããšã«ãã¹ã¿ãã¯ãã¬ãŒã¹ã«ããããšã©ãŒã³ã³ããã¹ããä¿æããéèŠãªåœ¹å²ã«ã€ããŠæãäžããŸããé¢é£ããã¡ã«ããºã ãééãã課é¡ãããã³æå³ã®ãããšã©ãŒæ å ±ãæäŸãã Wasm ã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ããããã®ãã¹ããã©ã¯ãã£ã¹ãæ¢ããéçºè ãããŸããŸãªç°å¢ãã¢ãŒããã¯ãã£ã«ããã£ãŠåé¡ãè¿ éã«ç¹å®ããŠè§£æ±ºã§ããããã«ããŸãã
WebAssemblyäŸå€åŠçã®çè§£
WebAssembly ã¯ãèšèšäžãäŸå€çãªç¶æ³ãåŠçããã¡ã«ããºã ãæäŸããŸããæ»ãå€ã³ãŒããã°ããŒãã«ãšã©ãŒãã©ã°ã«å€§ããäŸåããäžéšã®èšèªãšã¯ç°ãªããWebAssembly ã¯æç€ºçãªäŸå€åŠçãçµã¿èŸŒãã§ãããã³ãŒãã®æçããåäžããããã¹ãŠã®é¢æ°åŒã³åºãåŸã«ãšã©ãŒãæåã§ãã§ãã¯ããéçºè ã®è² æ ã軜æžããŸããWasm ã®äŸå€ã¯éåžžãåšå²ã®ã³ãŒããããã¯ã«ãã£ãŠãã£ããããã³åŠçã§ããå€ãšããŠè¡šãããŸããããã»ã¹ã«ã¯éåžžãæ¬¡ã®æé ãå«ãŸããŸãã
- äŸå€ã®ã¹ããŒ: ãšã©ãŒç¶æ ãçºçãããšãWasm 颿°ã¯äŸå€ããã¹ããŒãã§ããŸããããã¯ãçŸåšã®å®è¡ãã¹ãå埩äžèœãªåé¡ã«ééããããšã瀺ããŸãã
- äŸå€ã®ãã£ãã: äŸå€ãã¹ããŒããå¯èœæ§ã®ããã³ãŒããå²ãã®ã¯ãcatchããããã¯ã§ãããã®ãããã¯ã¯ãç¹å®ã®çš®é¡ã®äŸå€ãã¹ããŒãããå Žåã«å®è¡ãããã³ãŒããå®çŸ©ããŸããè€æ°ã® catch ãããã¯ã§ãããŸããŸãªçš®é¡ã®äŸå€ãåŠçã§ããŸãã
- äŸå€åŠçããžãã¯: catch ãããã¯å ã§ãéçºè ã¯ããšã©ãŒã®ãã°èšé²ããšã©ãŒããã®å埩ã®è©Šã¿ããŸãã¯ã¢ããªã±ãŒã·ã§ã³ã®æ£åžžãªçµäºãªã©ãã«ã¹ã¿ã ãšã©ãŒåŠçããžãã¯ãå®è£ ã§ããŸãã
ãã®æ§é åãããäŸå€åŠçã®ã¢ãããŒãã¯ãããã€ãã®å©ç¹ãæäŸããŸãã
- ã³ãŒãã®å¯èªæ§ã®åäž: æç€ºçãªäŸå€åŠçã«ããããšã©ãŒåŠçããžãã¯ãããèŠãããçè§£ãããããªããŸããããã¯ãéåžžå®è¡ãããŒããåé¢ãããŠããããã§ãã
- ãã€ã©ãŒãã¬ãŒãã³ãŒãã®åæž: éçºè ã¯ããã¹ãŠã®é¢æ°åŒã³åºãåŸã«ãšã©ãŒãæåã§ãã§ãã¯ããå¿ èŠããªããå埩ã³ãŒãã®éãåæžã§ããŸãã
- ãšã©ãŒäŒæã®åŒ·å: äŸå€ã¯ããã£ããããããŸã§ã³ãŒã«ã¹ã¿ãã¯ãèªåçã«äŒæãããšã©ãŒãé©åã«åŠçãããããã«ããŸãã
ã¹ã¿ãã¯ãã¬ãŒã¹ã®éèŠæ§
äŸå€åŠçã¯ãšã©ãŒãé©åã«ç®¡çããæ¹æ³ãæäŸããŸãããåé¡ã®æ ¹æ¬åå ã蚺æããã«ã¯ååã§ã¯ãªãããšããããããŸããããã§ã¹ã¿ãã¯ãã¬ãŒã¹ãç»å ŽããŸããã¹ã¿ãã¯ãã¬ãŒã¹ã¯ãäŸå€ãã¹ããŒãããæç¹ã§ã®ã³ãŒã«ã¹ã¿ãã¯ã®ããã¹ã衚çŸã§ãããšã©ãŒã«ã€ãªãã£ã颿°åŒã³åºãã®ã·ãŒã±ã³ã¹ã瀺ãããšã©ãŒãã©ã®ããã«çºçããããçè§£ããããã®è²Žéãªã³ã³ããã¹ããæäŸããŸãã
äžè¬çãªã¹ã¿ãã¯ãã¬ãŒã¹ã«ã¯ãã¹ã¿ãã¯å ã®å颿°åŒã³åºãã«ã€ããŠæ¬¡ã®æ å ±ãå«ãŸããŠããŸãã
- 颿°å: åŒã³åºããã颿°ã®ååã
- ãã¡ã€ã«å: 颿°ãå®çŸ©ãããŠãããœãŒã¹ãã¡ã€ã«ã®åå (å©çšå¯èœãªå Žå)ã
- è¡çªå·: 颿°åŒã³åºããçºçãããœãŒã¹ãã¡ã€ã«ã®è¡çªå·ã
- åçªå·: 颿°åŒã³åºããçºçããè¡ã®åçªå· (ããŸãäžè¬çã§ã¯ãããŸãããã圹ç«ã¡ãŸã)ã
ã¹ã¿ãã¯ãã¬ãŒã¹ã調ã¹ãããšã§ãéçºè ã¯äŸå€ã«ã€ãªãã£ãå®è¡ãã¹ããã¬ãŒã¹ãããšã©ãŒã®åå ãç¹å®ãããšã©ãŒçºçæã®ã¢ããªã±ãŒã·ã§ã³ã®ç¶æ ãçè§£ã§ããŸããããã¯ãè€éãªåé¡ããããã°ããã¢ããªã±ãŒã·ã§ã³ã®å®å®æ§ãåäžãããããã«éåžžã«è²Žéã§ããéèã¢ããªã±ãŒã·ã§ã³ã WebAssembly ã«ã³ã³ãã€ã«ãããéå©ãèšç®ããŠããã·ããªãªãæ³åããŠãã ãããååž°çãªé¢æ°åŒã³åºããåå ã§ãã¹ã¿ãã¯ãªãŒããŒãããŒãçºçããŸããé©åã«åœ¢æãããã¹ã¿ãã¯ãã¬ãŒã¹ã¯ãååž°çãªé¢æ°ãçŽæ¥æã瀺ããéçºè ãç¡éååž°ãè¿ éã«èšºæããŠä¿®æ£ã§ããããã«ããŸãã
課é¡ïŒWebAssemblyã¹ã¿ãã¯ãã¬ãŒã¹ã§ã®ãšã©ãŒã³ã³ããã¹ãã®ä¿æ
ã¹ã¿ãã¯ãã¬ãŒã¹ã®æŠå¿µã¯ç°¡åã§ãããWebAssembly ã§æå³ã®ããã¹ã¿ãã¯ãã¬ãŒã¹ãçæããã®ã¯å°é£ãªå ŽåããããŸããéµãšãªãã®ã¯ãã³ã³ãã€ã«ããã³å®è¡ããã»ã¹å šäœã§ãšã©ãŒã³ã³ããã¹ããä¿æããããšã§ããããã«ã¯ãããã€ãã®èŠå ãé¢ä¿ããŸãã
1. ãœãŒã¹ãããã®çæãšå¯çšæ§
WebAssembly ã¯ãC++ãRustãTypeScript ãªã©ã®é«æ°ŽæºèšèªããçæãããããšããããããŸããæå³ã®ããã¹ã¿ãã¯ãã¬ãŒã¹ãæäŸããã«ã¯ãã³ã³ãã€ã©ããœãŒã¹ããããçæããå¿ èŠããããŸãããœãŒã¹ãããã¯ãã³ã³ãã€ã«ããã WebAssembly ã³ãŒããå ã®ãœãŒã¹ã³ãŒãã«ãããã³ã°ãããã¡ã€ã«ã§ããããã«ããããã©ãŠã¶ãŸãã¯ã©ã³ã¿ã€ã ç°å¢ã¯ãWebAssembly ãã€ãã³ãŒããªãã»ããã§ã¯ãªããã¹ã¿ãã¯ãã¬ãŒã¹ã«å ã®ãã¡ã€ã«åãšè¡çªå·ã衚瀺ã§ããŸããããã¯ãçž®å°ãŸãã¯é£èªåãããã³ãŒããæ±ãå Žåã«ç¹ã«éèŠã§ããããšãã°ãTypeScript ã䜿çšã㊠Web ã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ããWebAssembly ã«ã³ã³ãã€ã«ããå Žåã¯ãTypeScript ã³ã³ãã€ã© (tsc) ãæ§æããŠãœãŒã¹ããã (`--sourceMap`) ãçæããå¿ èŠããããŸããåæ§ã«ãEmscripten ã䜿çšã㊠C++ ã³ãŒãã WebAssembly ã«ã³ã³ãã€ã«ããå Žåã¯ã`-g` ãã©ã°ã䜿çšããŠãããã°æ å ±ãå«ãããœãŒã¹ããããçæããå¿ èŠããããŸãã
ãã ãããœãŒã¹ãããã®çæã¯ãæŠãã®ååã«ãããŸããããã©ãŠã¶ãŸãã¯ã©ã³ã¿ã€ã ç°å¢ã¯ããœãŒã¹ãããã«ã¢ã¯ã»ã¹ã§ããå¿ èŠããããŸããããã«ã¯éåžžãWebAssembly ãã¡ã€ã«ãšãšãã«ãœãŒã¹ããããæäŸããããšãå«ãŸããŸãããã©ãŠã¶ã¯ãœãŒã¹ããããèªåçã«ããŒããããããã䜿çšããŠã¹ã¿ãã¯ãã¬ãŒã¹ã«å ã®ãœãŒã¹ã³ãŒãæ å ±ã衚瀺ããŸãããœãŒã¹ãããã CORS ããªã·ãŒãŸãã¯ãã®ä»ã®ã»ãã¥ãªãã£å¶éã«ãã£ãŠãããã¯ãããå¯èœæ§ãããããããã©ãŠã¶ããœãŒã¹ãããã«ã¢ã¯ã»ã¹ã§ããããšã確èªããããšãéèŠã§ããããšãã°ãWebAssembly ã³ãŒããšãœãŒã¹ããããç°ãªããã¡ã€ã³ã§ãã¹ããããŠããå Žåã¯ããã©ãŠã¶ããœãŒã¹ãããã«ã¢ã¯ã»ã¹ã§ããããã« CORS ããããŒãæ§æããå¿ èŠããããŸãã
2. ãããã°æ å ±ã®ä¿æ
ã³ã³ãã€ã«ããã»ã¹äžãã³ã³ãã€ã©ã¯çæãããã³ãŒãã®ããã©ãŒãã³ã¹ãåäžãããããã«æé©åãå®è¡ããããšããããããŸãããããã®æé©åã¯ããããã°æ å ±ãåé€ãŸãã¯å€æŽããããšããããæ£ç¢ºãªã¹ã¿ãã¯ãã¬ãŒã¹ã®çæãå°é£ã«ããŸããããšãã°ãã€ã³ã©ã€ã³é¢æ°ã䜿çšãããšããšã©ãŒã«ã€ãªãã£ãå ã®é¢æ°åŒã³åºããç¹å®ããããšãé£ãããªãå¯èœæ§ããããŸããåæ§ã«ããããã³ãŒãåé€ã¯ããšã©ãŒã«é¢äžããŠããå¯èœæ§ã®ãã颿°ãåé€ã§ããŸããEmscripten ãªã©ã®ã³ã³ãã€ã©ã¯ãæé©åãšãããã°æ å ±ã®ã¬ãã«ãå¶åŸ¡ããããã®ãªãã·ã§ã³ãæäŸããŸããEmscripten ã§ `-g` ãã©ã°ã䜿çšãããšãã³ã³ãã€ã©ã¯çæããã WebAssembly ã³ãŒãã«ãããã°æ å ±ãå«ããããã«æç€ºãããŸãããŸããããã©ãŒãã³ã¹ãšãããã°ã®ããããã®ãã©ã³ã¹ãåãããã«ãããŸããŸãªæé©åã¬ãã« (`-O0`ã`-O1`ã`-O2`ã`-O3`ã`-Os`ã`-Oz`) ã䜿çšããããšãã§ããŸãã`-O0` ã¯ã»ãšãã©ã®æé©åãç¡å¹ã«ããæãå€ãã®ãããã°æ å ±ãä¿æããŸããã`-O3` ã¯ç©æ¥µçãªæé©åãæå¹ã«ããäžéšã®ãããã°æ å ±ãåé€ããå ŽåããããŸãã
ããã©ãŒãã³ã¹ãšãããã°ã®ããããã®ãã©ã³ã¹ãåãããšãéèŠã§ããéçºç°å¢ã§ã¯ãäžè¬ã«æé©åãç¡å¹ã«ããã§ããã ãå€ãã®ãããã°æ å ±ãä¿æããããšããå§ãããŸããæ¬çªç°å¢ã§ã¯ãæé©åãæå¹ã«ããŠããã©ãŒãã³ã¹ãåäžãããããšãã§ããŸããããšã©ãŒãçºçããå Žåã®ãããã°ã容æã«ããããã«ãäžéšã®ãããã°æ å ±ãå«ããããšãæ€èšããå¿ èŠããããŸããããã¯ãéçºç°å¢ãšæ¬çªç°å¢ã§åå¥ã®ãã«ãæ§æã䜿çšããæé©åã¬ãã«ãšãããã°æ å ±ã®èšå®ãç°ãªãããã«ããããšã§å®çŸã§ããŸãã
3. ã©ã³ã¿ã€ã ç°å¢ã®ãµããŒã
ã©ã³ã¿ã€ã ç°å¢ (ãã©ãŠã¶ãNode.jsãã¹ã¿ã³ãã¢ãã³ã® WebAssembly ã©ã³ã¿ã€ã ãªã©) ã¯ãã¹ã¿ãã¯ãã¬ãŒã¹ã®çæãšè¡šç€ºã«ãããŠéèŠãªåœ¹å²ãæãããŸããã©ã³ã¿ã€ã ç°å¢ã¯ãWebAssembly ã³ãŒããè§£æãããœãŒã¹ãããã«ã¢ã¯ã»ã¹ããWebAssembly ãã€ãã³ãŒããªãã»ããããœãŒã¹ã³ãŒãã®å Žæã«å€æã§ããå¿ èŠããããŸãããã¹ãŠã®ã©ã³ã¿ã€ã ç°å¢ã WebAssembly ã¹ã¿ãã¯ãã¬ãŒã¹ã«å¯ŸããŠåãã¬ãã«ã®ãµããŒããæäŸããŠããããã§ã¯ãããŸãããäžéšã®ã©ã³ã¿ã€ã ç°å¢ã¯ WebAssembly ãã€ãã³ãŒããªãã»ããã®ã¿ã衚瀺ããå ã®ãœãŒã¹ã³ãŒãæ å ±ã衚瀺ã§ããã©ã³ã¿ã€ã ç°å¢ããããŸããææ°ã®ãã©ãŠã¶ã¯ãç¹ã«ãœãŒã¹ããããå©çšå¯èœãªå ŽåãWebAssembly ã¹ã¿ãã¯ãã¬ãŒã¹ã«å¯ŸããŠåªãããµããŒããæäŸããŸããNode.js ã¯ãç¹ã« `--enable-source-maps` ãã©ã°ã䜿çšããå ŽåãWebAssembly ã¹ã¿ãã¯ãã¬ãŒã¹ã«å¯ŸããŠåªãããµããŒããæäŸããŸãããã ããäžéšã®ã¹ã¿ã³ãã¢ãã³ WebAssembly ã©ã³ã¿ã€ã ã¯ãã¹ã¿ãã¯ãã¬ãŒã¹ã®ãµããŒããéãããŠããå ŽåããããŸãã
WebAssembly ã¢ããªã±ãŒã·ã§ã³ãããŸããŸãªã©ã³ã¿ã€ã ç°å¢ã§ãã¹ãããŠãã¹ã¿ãã¯ãã¬ãŒã¹ãæ£ããçæãããæå³ã®ããæ å ±ãæäŸããŠããããšã確èªããããšãéèŠã§ããããŸããŸãªç°å¢ã§ã¹ã¿ãã¯ãã¬ãŒã¹ãçæããããã«ãç°ãªãããŒã«ãŸãã¯ãã¯ããã¯ã䜿çšããå¿ èŠãããå ŽåããããŸããããšãã°ããã©ãŠã¶ã§ `console.trace()` 颿°ã䜿çšããŠã¹ã¿ãã¯ãã¬ãŒã¹ãçæããããNode.js ã§ `node --stack-trace-limit` ãã©ã°ã䜿çšããŠã¹ã¿ãã¯ãã¬ãŒã¹ã«è¡šç€ºãããã¹ã¿ãã¯ãã¬ãŒã ã®æ°ãå¶åŸ¡ãããã§ããŸãã
4. éåææäœãšã³ãŒã«ããã¯
WebAssembly ã¢ããªã±ãŒã·ã§ã³ã«ã¯ãéåææäœãšã³ãŒã«ããã¯ãå«ãŸããããšããããããŸããããã«ãããå®è¡ãã¹ãã³ãŒãã®ããŸããŸãªéšåããžã£ã³ãããå¯èœæ§ããããããæ£ç¢ºãªã¹ã¿ãã¯ãã¬ãŒã¹ã®çæãé£ãããªãå¯èœæ§ããããŸããããšãã°ãWebAssembly 颿°ãéåææäœãå®è¡ãã JavaScript 颿°ãåŒã³åºãå Žåãã¹ã¿ãã¯ãã¬ãŒã¹ã«å ã® WebAssembly 颿°åŒã³åºããå«ãŸããªãå ŽåããããŸãããã®èª²é¡ã«å¯ŸåŠããããã«ãéçºè ã¯å®è¡ã³ã³ããã¹ããæ³šææ·±ã管çããæ£ç¢ºãªã¹ã¿ãã¯ãã¬ãŒã¹ãçæããããã«å¿ èŠãªæ å ±ãå©çšå¯èœã§ããããšã確èªããå¿ èŠããããŸãã1ã€ã®ã¢ãããŒãã¯ãéåæã¹ã¿ãã¯ãã¬ãŒã¹ã©ã€ãã©ãªã䜿çšããããšã§ããããã«ãããéåææäœãéå§ãããæç¹ã§ã¹ã¿ãã¯ãã¬ãŒã¹ããã£ããã£ããæäœãå®äºããæç¹ã§ã®ã¹ã¿ãã¯ãã¬ãŒã¹ãšçµã¿åãããããšãã§ããŸãã
å¥ã®ã¢ãããŒãã¯ãæ§é åãã®ã³ã°ã䜿çšããããšã§ããããã«ã¯ãã³ãŒãã®ããŸããŸãªãã€ã³ãã§å®è¡ã³ã³ããã¹ãã«é¢ããé¢é£æ å ±ããã°ã«èšé²ããããšãå«ãŸããŸãããã®æ å ±ã¯ãå®è¡ãã¹ãåæ§ç¯ããããå®å šãªã¹ã¿ãã¯ãã¬ãŒã¹ãçæããããã«äœ¿çšã§ããŸããããšãã°ãå颿°åŒã³åºãã®éå§æãšçµäºæã«ã颿°åããã¡ã€ã«åãè¡çªå·ãããã³ãã®ä»ã®é¢é£æ å ±ããã°ã«èšé²ã§ããŸããããã¯ãè€éãªéåææäœããããã°ããå Žåã«ç¹ã«åœ¹ç«ã¡ãŸããæ§é åãããããŒã¿ã§è£åŒ·ããã JavaScript ã® `console.log` ã®ãããªã©ã€ãã©ãªã¯ãéåžžã«è²Žéã§ãã
ãšã©ãŒã³ã³ããã¹ããä¿æããããã®ãã¹ããã©ã¯ãã£ã¹
WebAssembly ã¢ããªã±ãŒã·ã§ã³ãæå³ã®ããã¹ã¿ãã¯ãã¬ãŒã¹ãçæããããã«ããã«ã¯ã次ã®ãã¹ããã©ã¯ãã£ã¹ã«åŸã£ãŠãã ããã
- ãœãŒã¹ãããã®çæ: ã³ãŒãã WebAssembly ã«ã³ã³ãã€ã«ãããšãã¯ãå¿ ããœãŒã¹ããããçæããŠãã ãããã³ã³ãã€ã©ãæ§æããŠããããã°æ å ±ãå«ããã³ã³ãã€ã«ãããã³ãŒããå ã®ãœãŒã¹ã³ãŒãã«ãããã³ã°ãããœãŒã¹ããããçæããŸãã
- ãããã°æ å ±ã®ä¿æ: ãããã°æ å ±ãåé€ããç©æ¥µçãªæé©åã¯é¿ããŠãã ãããããã©ãŒãã³ã¹ãšãããã°ã®ããããã®ãã©ã³ã¹ãåãé©åãªæé©åã¬ãã«ã䜿çšããŠãã ãããéçºç°å¢ãšæ¬çªç°å¢ã§åå¥ã®ãã«ãæ§æã䜿çšããããšãæ€èšããŠãã ããã
- ç°ãªãç°å¢ã§ã®ãã¹ã: WebAssembly ã¢ããªã±ãŒã·ã§ã³ãç°ãªãã©ã³ã¿ã€ã ç°å¢ã§ãã¹ãããŠãã¹ã¿ãã¯ãã¬ãŒã¹ãæ£ããçæãããæå³ã®ããæ å ±ãæäŸããŠããããšã確èªããŸãã
- éåæã¹ã¿ãã¯ãã¬ãŒã¹ã©ã€ãã©ãªã®äœ¿çš: ã¢ããªã±ãŒã·ã§ã³ã«éåææäœãå«ãŸããŠããå Žåã¯ãéåæã¹ã¿ãã¯ãã¬ãŒã¹ã©ã€ãã©ãªã䜿çšããŠãéåææäœãéå§ãããæç¹ã§ã¹ã¿ãã¯ãã¬ãŒã¹ããã£ããã£ããŸãã
- æ§é åãã®ã³ã°ã®å®è£ : æ§é åãã®ã³ã°ãå®è£ ããŠãã³ãŒãã®ããŸããŸãªãã€ã³ãã§å®è¡ã³ã³ããã¹ãã«é¢ããé¢é£æ å ±ããã°ã«èšé²ããŸãããã®æ å ±ã¯ãå®è¡ãã¹ãåæ§ç¯ããããå®å šãªã¹ã¿ãã¯ãã¬ãŒã¹ãçæããããã«äœ¿çšã§ããŸãã
- ãããããããšã©ãŒã¡ãã»ãŒãžã®äœ¿çš: äŸå€ãã¹ããŒãããšãã¯ããšã©ãŒã®åå ãæç¢ºã«èª¬æãããããããããšã©ãŒã¡ãã»ãŒãžãæäŸããŸããããã«ãããéçºè ã¯åé¡ããã°ããçè§£ãããšã©ãŒã®åå ãç¹å®ã§ããŸããããšãã°ãäžè¬çãªãErrorãäŸå€ãã¹ããŒãã代ããã«ãç¡å¹ãªåŒæ°ã説æããã¡ãã»ãŒãžãå«ããããå ·äœçãªãInvalidArgumentExceptionããªã©ã®äŸå€ãã¹ããŒããŸãã
- å°çšã®ãšã©ãŒã¬ããŒããµãŒãã¹ã®äœ¿çšãæ€èšãã: SentryãBugsnagãRollbar ãªã©ã®ãµãŒãã¹ã¯ãWebAssembly ã¢ããªã±ãŒã·ã§ã³ãããšã©ãŒãèªåçã«ãã£ããã£ããŠã¬ããŒãã§ããŸãããããã®ãµãŒãã¹ã¯éåžžã詳现ãªã¹ã¿ãã¯ãã¬ãŒã¹ãããšã©ãŒã®èšºæãšä¿®æ£ãè¿ éã«è¡ãã®ã«åœ¹ç«ã€ãã®ä»ã®æ å ±ãæäŸããŸãããŸãããšã©ãŒã®ã°ã«ãŒãåããŠãŒã¶ãŒã³ã³ããã¹ãããªãªãŒã¹ã®è¿œè·¡ãªã©ã®æ©èœãæäŸããããšããããããŸãã
äŸãšãã¢ã³ã¹ãã¬ãŒã·ã§ã³
ãããã®æŠå¿µãå®è·µçãªäŸã§èª¬æããŸããããEmscripten ã䜿çšã㊠WebAssembly ã«ã³ã³ãã€ã«ãããç°¡å㪠C++ ããã°ã©ã ãæ€èšããŸãã
C++ ã³ãŒã (example.cpp):
#include <iostream>
int divide(int a, int b) {
if (b == 0) {
throw std::runtime_error("Division by zero!");
}
return a / b;
}
int main() {
try {
int result = divide(10, 0);
std::cout << "Result: " << result << std::endl;
} catch (const std::runtime_error& ex) {
std::cerr << "Error: " << ex.what() << std::endl;
}
return 0;
}
Emscripten ã§ã®ã³ã³ãã€ã«:
emcc example.cpp -o example.js -s WASM=1 -g
ãã®äŸã§ã¯ã`-g` ãã©ã°ã䜿çšããŠãããã°æ å ±ãçæããŸãã`divide` 颿°ã `b = 0` ã§åŒã³åºããããšã`std::runtime_error` äŸå€ãã¹ããŒãããŸãã`main` ã® catch ãããã¯ã¯äŸå€ããã£ãããããšã©ãŒã¡ãã»ãŒãžãåºåããŸããéçºè ããŒã«ãéããç¶æ ã§ãã®ã³ãŒãããã©ãŠã¶ã§å®è¡ãããšããã¡ã€ã«å (`example.cpp`)ãè¡çªå·ãããã³é¢æ°åãå«ãã¹ã¿ãã¯ãã¬ãŒã¹ã衚瀺ãããŸããããã«ããããšã©ãŒã®åå ããã°ããç¹å®ã§ããŸãã
Rust ã®äŸ:
Rust ã®å Žåã`wasm-pack` ãŸã㯠`cargo build --target wasm32-unknown-unknown` ã䜿çšã㊠WebAssembly ã«ã³ã³ãã€ã«ãããšããœãŒã¹ããããçæããããšãã§ããŸãã`Cargo.toml` ã«å¿ èŠãªæ§æãããããšã確èªããéçºã«ã¯ãããã°ãã«ãã䜿çšããŠéèŠãªãããã°æ å ±ãä¿æããŸãã
JavaScript ãš WebAssembly ã䜿çšãããã¢ã³ã¹ãã¬ãŒã·ã§ã³:
WebAssembly ã JavaScript ãšçµ±åããããšãã§ããŸããJavaScript ã³ãŒã㯠WebAssembly ã¢ãžã¥ãŒã«ãããŒãããŠå®è¡ã§ããWebAssembly ã³ãŒãã«ãã£ãŠã¹ããŒãããäŸå€ãåŠçããããšãã§ããŸããããã«ãããWebAssembly ã®ããã©ãŒãã³ã¹ãš JavaScript ã®æè»æ§ãçµã¿åããããã€ããªããã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ã§ããŸããWebAssembly ã³ãŒãããäŸå€ãã¹ããŒããããšãJavaScript ã³ãŒãã¯äŸå€ããã£ãããã`console.trace()` 颿°ã䜿çšããŠã¹ã¿ãã¯ãã¬ãŒã¹ãçæã§ããŸãã
çµè«
WebAssembly ã¹ã¿ãã¯ãã¬ãŒã¹ã§ãšã©ãŒã³ã³ããã¹ããä¿æããããšã¯ãå ç¢ã§ãããã°å¯èœãªã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ããããã«éèŠã§ãããã®èšäºã§æŠèª¬ãããŠãããã¹ããã©ã¯ãã£ã¹ã«åŸãããšã§ãéçºè 㯠WebAssembly ã¢ããªã±ãŒã·ã§ã³ãããšã©ãŒã®èšºæãšä¿®æ£ã«åœ¹ç«ã€è²Žéãªæ å ±ãæäŸããæå³ã®ããã¹ã¿ãã¯ãã¬ãŒã¹ãçæããããã«ããããšãã§ããŸããããã¯ãWebAssembly ãããåºãæ¡çšããããŸããŸãè€éãªã¢ããªã±ãŒã·ã§ã³ã§äœ¿çšãããããã«ãªãã«ã€ããŠãç¹ã«éèŠã«ãªããŸããé©åãªãšã©ãŒåŠçãšãããã°ã®ãã¯ããã¯ã«æè³ããããšã§ãé·æçã«ã¯ããå®å®ãããä¿¡é Œæ§ã®é«ããä¿å®å¯èœãª WebAssembly ã¢ããªã±ãŒã·ã§ã³ãã倿§ãªã°ããŒãã«ç°å¢ã«ããã£ãŠå®çŸãããŸãã
WebAssembly ãšã³ã·ã¹ãã ãé²åããã«ã€ããŠãäŸå€åŠçãšã¹ã¿ãã¯ãã¬ãŒã¹ã®çæãããã«æ¹åãããããšãæåŸ ãããŸããå ç¢ã§ãããã°å¯èœãª WebAssembly ã¢ããªã±ãŒã·ã§ã³ãããã«ç°¡åã«æ§ç¯ã§ããæ°ããããŒã«ãšãã¯ããã¯ãç»å ŽããŸãããã®åŒ·åãªãã¯ãããžãŒã®å¯èœæ§ãæå€§éã«æŽ»çšããããšèããŠããéçºè ã«ãšã£ãŠãWebAssembly ã®ææ°ã®éçºç¶æ³ãåžžã«ææ¡ããããšãäžå¯æ¬ ã«ãªããŸãã